package com.enumdemo.multi_channel_distribution.demo5;

import java.util.EnumMap;
import java.util.Map;
import static com.enumdemo.multi_channel_distribution.demo1.Outcome.*;
import com.enumdemo.multi_channel_distribution.demo1.Outcome;
import com.enumdemo.multi_channel_distribution.demo5.face.Competitor;

/**
 * 通过EnumMap实现多路分发
 * 
 * @author Administrator
 *
 */
public enum RoShamBo5 implements Competitor<RoShamBo5> {

	PAPER, SCISSORS, ROCK;
	static Map<RoShamBo5, EnumMap<RoShamBo5, Outcome>> table = new EnumMap<RoShamBo5, EnumMap<RoShamBo5, Outcome>>(
			RoShamBo5.class);

	static {
		for (RoShamBo5 it : RoShamBo5.values()) {
			table.put(it, new EnumMap<RoShamBo5, Outcome>(RoShamBo5.class));
		}
		initRow(PAPER, DRAW, LOSE, WIN);
		initRow(SCISSORS, WIN, DRAW, LOSE);
		initRow(ROCK, LOSE, WIN, DRAW);
	}

	static void initRow(RoShamBo5 it, Outcome vPAPER, Outcome vSCISSORS,
			Outcome vROCK) {
		EnumMap<RoShamBo5, Outcome> row = RoShamBo5.table.get(it);
		row.put(RoShamBo5.PAPER, vPAPER);
		row.put(RoShamBo5.SCISSORS, vSCISSORS);
		row.put(RoShamBo5.ROCK, vROCK);
	}

	@Override
	public Outcome compete(RoShamBo5 it) {
		// 完成2次分发
		return table.get(this).get(it);
	}

	public static void main(String[] args) {
		RoShamBo.play(RoShamBo5.class, 20);
	}

}
